<?PHP

namespace SDF;

/*
 * 发送：
 * GET  http://localhost/restful/class  列出所有班级
 * GET  http://localhost/restful/class/1    获取指定班的信息
 * POST http://localhost/restful/class?name=SAT班&count=23 新建一个班
 * PUT  http://localhost/restful/class/1?name=SAT班&count=23  更新指定班的信息（全部信息）
 * PATCH  http://localhost/restful/class/1?name=SAT班    更新指定班的信息（部分信息）
 * DELETE  http://localhost/restful/class/1 删除指定班
*/
/*//数据操作类
require('Request.php');
//输出类
require('Response.php');
//获取数据
$data = Request::getRequest();
//输出结果
Response::sendResponse($data);*/


class SDF {
    /**
     * 自定义的异常处理函数
     * @param \Exception $exception
     */
    final public static function exceptionHandler($exception){
        if (!empty($_SERVER['argv'][1])) {
            $msg = "<b>Exception:</b>".$exception->getCode() .':'. $exception->getMessage().' in '.$exception->getFile().' on line '.$exception->getLine()."\n";
            echo $msg;
        }elseif(IS_AJAX){
            echo json_encode(
                array(
                    'status_code'=>300,//$exception->getCode(),
                    'message'=>$exception->getMessage(),
                    'file'=>$exception->getFile(),
                    'line'=>$exception->getLine(),
                    'response'=>array(),
                )
            );exit;
        }else{
            $error_code = $exception->getCode();
            self::set_status_header($error_code);
            $msg = ['msg'=>"<b>Exception:</b>".$exception->getCode() .':'. $exception->getMessage().' in '.$exception->getFile().' on line '.$exception->getLine()."\n"];
            if($error_code == 404){
                View::display($msg,'_show404');exit;
            }
            View::display($msg ,'_error');exit;
        }
    }

    /**
     * 不使用路由器启动框架
     * @throws \Exception
     */
    public static function run(){
        if (!empty($_SERVER['HTTP_HOST'])) {
            $configPath = \str_replace(':', '_', $_SERVER['HTTP_HOST']);
        } elseif (!empty($_SERVER['argv'][1])) {
            $parse_url = \parse_url($_SERVER['argv'][1]);
            if(isset($parse_url['host'])) $configPath = \str_replace(':', '_', $parse_url['host']);
            if(isset($parse_url['path'])) $_SERVER['PATH_INFO'] = $parse_url['path'];
        }
        if (!empty($configPath)) {
            self::setConfigPath($configPath);
        }
        \set_exception_handler(__CLASS__ . '::exceptionHandler');//函数设置用户自定义的异常处理函数。该函数用于创建运行时期间的用户自己的异常处理方法。该函数会返回旧的异常处理程序，若失败，则返回 null。
        //$timeZone = Config::get('time_zone', 'Asia/Chongqing');
        \date_default_timezone_set('Asia/Chongqing');//设置时区


        $ControllersClassName = Config::get('ctrl_path', 'Controllers') . '\\' . $parse_info['control'];//控制器名字
        if (!\class_exists($ControllersClassName)) {
            throw new \Exception("no class {$ControllersClassName}", 404);
        }
        $ControllersClassObj = new $ControllersClassName();
        if (method_exists($ControllersClassObj, '_remap')) {
            $ControllersClassObj->_remap($parse_info['action'], $parse_info['aPathInfo']);
        } else {
            if (!method_exists($ControllersClassObj, $parse_info['action'])) {
                throw new \Exception('找不到方法：' . $parse_info['control'] . '->' . $parse_info['action'] . '()', 404);
            }
            call_user_func_array(array(&$ControllersClassObj, $parse_info['action']), $parse_info['aPathInfo']);
        }



    }


}